package interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.table.TableRowSorter;

import org.hibernate.Session;

import dao.ArticulosDAOImpl;
import dao.ClientesDAOImpl;
import dao.OfertasDAOImpl;
import dao.utils.HibernateUtil;
import domain.Articulos;
import domain.Clientes;
import domain.Ofertas;

public class OfertasInterfaz extends JFrame implements ActionListener,
		KeyListener, MouseListener {

	private static final long serialVersionUID = 1L;

	// Declaramos el objeto login
	private Login login;

	private JPanel panelPrincipal;

	// Botn del panel Izquierdo
	private JButton btnCambioUsuario = new JButton("Cambio de usuario",
			new ImageIcon("images/people.png"));

	private boolean esAdministrador;
	// Paneles
	private JPanel panelCentral;
	private JPanel panelIzquierdo;

	private JTextField txtId = new JTextField();
	private JTextField txtCod = new JTextField();
	private JTextField txtFecha_Inicio = new JTextField();
	private JTextField txtFecha_Final = new JTextField();
	private JTextField txtPorcentaje = new JTextField();
	private JComboBox<String> txtClase = new JComboBox<String>();

	private JLabel lbActiva = new JLabel("Activa"); // Muestra mensajes por
													// pantalla
	private JLabel lbCod = new JLabel("Articulo");
	private JLabel lbFecha_Inicio = new JLabel("Fecha de Inicio");
	private JLabel lbFecha_Final = new JLabel("Fecha de Finalidad");
	private JLabel lbPorcentaje = new JLabel("Porcentaje");
	private JLabel lbClase = new JLabel("Clase");

	private JButton btnAlta = new JButton("Guardar");
	private JButton btnBaja = new JButton("Baja");
	private JButton btnModif = new JButton("Modificar");
	private JButton btnLimpiar = new JButton("Limpiar");

	private JCheckBox Activa = new JCheckBox();

	private JScrollPane scrollPanel = null;
	private JTable table = null;
	private TableRowSorter<ModeloTabla> elQueOrdena;

	private JLabel lbGestionOfertas;
	private JLabel lbAltaOfertas;

	private ModeloTabla modelo;

	private ArrayList<Ofertas> Cod = new ArrayList<Ofertas>();
	private Ofertas oferta = new Ofertas();

	public OfertasInterfaz(JPanel pCentral, JPanel pIzquierdo,
			JPanel pPrincipal, Login login) {

		panelCentral = pCentral;
		panelIzquierdo = pIzquierdo;

		panelCentral.removeAll();
		panelIzquierdo.removeAll();

		mostrarPanelCentralGestion();

		mostrarPanelIzquierdo();

		panelCentral.updateUI();
		panelIzquierdo.updateUI();

		btnCambioUsuario.addActionListener(this);

	}

	public void mostrarPanelCentralGestion() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "GESTIÓN OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbActiva.setBounds(new Rectangle(75, 50, 140, 20));
		Activa.setBounds(new Rectangle(220, 50, 22, 20));
		lbCod.setBounds(new Rectangle(75, 75, 140, 20));
		txtCod.setBounds(new Rectangle(220, 75, 80, 20));
		lbClase.setBounds(new Rectangle(75, 100, 120, 20));
		txtClase.setBounds(new Rectangle(220, 100, 50, 20));

		txtClase.addItem("Si");
		txtClase.addItem("No");

		panelCentral.add(lbActiva);
		panelCentral.add(Activa);
		panelCentral.add(lbCod);
		panelCentral.add(txtCod);
		panelCentral.add(lbClase);
		panelCentral.add(txtClase);

		// Se añaden los escuchadores
		txtId.addKeyListener(this);
		txtCod.addKeyListener(this);
		txtClase.addKeyListener(this);

		// Se añade la tabla con todos los registros. Dentro de este método
		// actualizamos los cambios del panelCentral
		// con panelCentral.updateUI()
		visualizarTabla();
	}

	public void mostrarPanelCentralAlta() {
		// Eliminamos todos los elementos del panelCentral;
		panelCentral.removeAll();
		// Inicializamos las variables de los JtextFields
		limpiarJTextFields();

		// Pone un borde y un título al panel
		panelCentral.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "ALTA OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		panelCentral.setLayout(null);

		// Se añaden los componentes
		lbCod.setBounds(new Rectangle(75, 75, 140, 20));
		txtCod.setBounds(new Rectangle(220, 75, 80, 20));
		lbFecha_Inicio.setBounds(new Rectangle(75, 100, 140, 20));
		txtFecha_Inicio.setBounds(new Rectangle(220, 100, 200, 20));
		lbFecha_Final.setBounds(new Rectangle(75, 125, 120, 20));
		txtFecha_Final.setBounds(new Rectangle(220, 125, 200, 20));
		lbPorcentaje.setBounds(new Rectangle(75, 150, 120, 20));
		txtPorcentaje.setBounds(new Rectangle(220, 150, 200, 20));
		lbClase.setBounds(new Rectangle(75, 175, 50, 20));
		txtClase.setBounds(new Rectangle(220, 175, 50, 20));

//		txtClase.addItem("Si");
//		txtClase.addItem("No");

		panelCentral.add(lbCod);
		panelCentral.add(txtCod);
		panelCentral.add(lbFecha_Inicio);
		panelCentral.add(txtFecha_Inicio);
		panelCentral.add(lbFecha_Final);
		panelCentral.add(txtFecha_Final);
		panelCentral.add(lbPorcentaje);
		panelCentral.add(txtPorcentaje);
		panelCentral.add(lbClase);
		panelCentral.add(txtClase);

		// Se añaden los escuchadores
		txtId.addKeyListener(this);
		txtCod.addKeyListener(this);
		txtFecha_Inicio.addKeyListener(this);
		txtFecha_Final.addKeyListener(this);
		txtPorcentaje.addKeyListener(this);
		txtClase.addKeyListener(this);
		// actualizamos los cambios del panelCentral

		// Actualizamos el panelCentral para que se reflejen los cambios
		panelCentral.updateUI();

		anadeBotones();
	}

	public void limpiarJTextFields() {
		txtId.setText("");
		txtCod.setText("");
		txtFecha_Inicio.setText("");
		txtFecha_Final.setText("");
		txtPorcentaje.setText("");
		// txtClase.setText("");
	}

	public void mostrarPanelIzquierdo() {

		// Pone un borde y un título al panel
		panelIzquierdo.setBorder(BorderFactory.createTitledBorder(BorderFactory
				.createLineBorder(new Color(255, 255, 255)), "MÓDULO OFERTAS",
				javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION,
				javax.swing.border.TitledBorder.DEFAULT_POSITION, new Font(
						"Calibri", 1, 14), new Color(255, 255, 255)));

		// Zona rígida (RigidArea): proporciona un área invisible de separación
		// horizontal y
		// vertical. En una caja horizontal, la separación vertical afectará a
		// todos sus
		// componentes y viceversa.
		Box caja = Box.createVerticalBox();
		// Se ponen las opciones disponibles para el módulo gestión de empleados
		// como etiquetas.
		lbGestionOfertas = new JLabel("Gestión Ofertas");

		// Se cambia el color de la etiqueta que va estar seleccionada por
		// defecto a un azul fuerte.
		lbGestionOfertas.setForeground(new Color(0, 0, 128));
		caja.add(lbGestionOfertas);
		caja.add(Box.createRigidArea(new Dimension(40, 15)));
		lbAltaOfertas = new JLabel("Alta Oferta");
		caja.add(lbAltaOfertas);
		

		// Se añaden los escuchadores de los JLabels
		lbGestionOfertas.addMouseListener(this);
		lbAltaOfertas.addMouseListener(this);
		
		// Se aaden las restricciones a la fila 0, columna 0
				GridBagConstraints constraintsCaja = new GridBagConstraints();
				constraintsCaja.anchor = GridBagConstraints.NORTHWEST;
				constraintsCaja.gridx = 0; // El rea de texto empieza en la columna
											// cero.
				constraintsCaja.gridy = 0; // El rea de texto empieza en la fila cero
				constraintsCaja.insets = new Insets(0, 0, 345, 0);

				// Se aade la caja con sus restricciones al panelIzquierdo
				panelIzquierdo.add(caja, constraintsCaja);

				// Se aaden las restricciones a la fila 1, columna 0
				GridBagConstraints constraintsCambioUsuario = new GridBagConstraints();
				constraintsCambioUsuario.gridx = 0; // El rea de texto empieza en la
													// columna cero.
				constraintsCambioUsuario.gridy = 1; // El rea de texto empieza en la
													// fila cero

				// Se aade el botn cambio de usuario con sus restricciones al
				// panelIzquierdo
				panelIzquierdo.add(btnCambioUsuario, constraintsCambioUsuario);
	}

	public void visualizarTabla() {

		Ofertas oferta; // Utilizado para guardar los datos que vamos
						// extrayendo de la consulta

		// Borramos si hubiese alguna otra tabla, para poderla actualizar a la
		// actual
		if (scrollPanel != null) {
			panelCentral.remove(scrollPanel);
		}

		// Abrimos una sesión en Hibernate para poder realizar la consulta
		Session sesion = HibernateUtil.getSession();
		// Obtenemos todos los empleados de la tabla empleados de la Base de
		// datos del proyecto.
		List<Ofertas> lista = new OfertasDAOImpl(sesion).findAll();

		Iterator<Ofertas> iter = lista.iterator();

		modelo = new ModeloTabla();
		table = new JTable(modelo);

		// Añadimos los títulos de las columnas de la tabla
		modelo.addColumn("Id");
		modelo.addColumn("Articulo");
		modelo.addColumn("Fecha de Inicio");
		modelo.addColumn("Fecha de Finalización");
		modelo.addColumn("Porcentaje");
		modelo.addColumn("Clase");

		// Declaramos una fila con 7 columnas. Estas 7 columnas componen cada
		// fila de nuestra tabla de búsquedas.
		String[] fila = new String[12];
		// Recorremos el Iterador mientras hayan elementos
		while (iter.hasNext()) {
			// Extraemos el objeto del Iterador obtenido de la lista de
			// resultados de la consulta realizada con Hibernate a la
			// base de datos.
			oferta = (Ofertas) iter.next();
			Cod.add(oferta);
			// Extraemos los datos de cada columna
			fila[0] = oferta.getIdOfertas().toString();
			fila[1] = oferta.getArticulos().getNombre();
			String tmp = oferta.getFechaHoraInicio().getDay() + "/"
					+ oferta.getFechaHoraInicio().getMonth() + "/"
					+ (1900 + oferta.getFechaHoraInicio().getYear());
			fila[2] = tmp;
			String tmp2 = oferta.getFechaHoraFinal().getDay() + "/"
					+ oferta.getFechaHoraFinal().getMonth() + "/"
					+ (1900 + oferta.getFechaHoraFinal().getYear());
			fila[3] = tmp2;
			fila[4] = oferta.getPorcentaje() + "";
			boolean tmp3 = oferta.isClase();
			if (tmp3) {
				fila[5] = "Solo para socios";
			} else {
				fila[5] = "Para todos";
			}

			modelo.addRow(fila); // Añade una fila al final de la tabla

		}

		elQueOrdena = new TableRowSorter<ModeloTabla>(modelo);
		table.setRowSorter(elQueOrdena);

		// Hacemos que sólo se pueda seleccionar una fila de la tabla
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		// Bloqueamos que las columnas de la tabla se pueden deslizar y cambiar
		// de posicion con el movimiento del mouse
		table.getTableHeader().setReorderingAllowed(false);

		// Le añadimos un scroll a la tabla
		scrollPanel = new JScrollPane(table);
		scrollPanel.setBounds(new Rectangle(75, 200, 1000, 150));
		panelCentral.add(scrollPanel);

		// Se añaden los botones Modificar, Baja y Limpiar
		btnModif.setBounds(new Rectangle(330, 400, 130, 30));
		btnBaja.setBounds(new Rectangle(480, 400, 130, 30));
		btnLimpiar.setBounds(new Rectangle(630, 400, 130, 30));
		panelCentral.add(btnModif);
		panelCentral.add(btnBaja);
		panelCentral.add(btnLimpiar);

		// Se añaden los escuchadores de los botones Modificar, Baja y Limpiar
		btnModif.addActionListener(this);
		btnBaja.addActionListener(this);
		btnLimpiar.addActionListener(this);
		table.addMouseListener(this);

		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		HibernateUtil.closeSession();
	}

	public void anadeBotones() {

		// Se añaden los botones Modificar, Baja y Limpiar
		btnAlta.setBounds(new Rectangle(330, 250, 130, 30));
		panelCentral.add(btnAlta);
		btnLimpiar.setBounds(new Rectangle(630, 250, 130, 30));
		panelCentral.add(btnLimpiar);

		// Se añaden los escuchadores de los botones Alta y Limpiar
		btnAlta.addActionListener(this);
		btnLimpiar.addActionListener(this);
		// Actualizamos el panelCentral para que se reflejen los cambios y
		// cerramos la sesión de Hibernate
		panelCentral.updateUI();
		// HibernateUtil.closeSession();
	}

	public void actionPerformed(ActionEvent e) {

		if (e.getSource() == btnAlta) { // Se pulsa el botón Alta
			Session sesion = HibernateUtil.getSession();
			HibernateUtil.beginTransaction();

			Articulos articulo = new ArticulosDAOImpl(sesion).findByDni(txtCod
					.getText());
			try {
				Ofertas oferta = new Ofertas();
				articulo.getIdArticulo();
				oferta.setArticulos(articulo);
				Date fecha = new Date();
				oferta.setFechaHoraInicio(fecha);
				oferta.setFechaHoraFinal(fecha);
				oferta.setPorcentaje(Integer.parseInt(txtPorcentaje.getText()));

				String nomTMP = (String) txtClase.getSelectedItem();
				if (nomTMP.equalsIgnoreCase("Si")) {
					oferta.setClase(true);
				} else {
					oferta.setClase(false);
				}

				boolean clie = new OfertasDAOImpl(sesion).guardarOferta(oferta);
				HibernateUtil.endTransaction();
				// HibernateUtil.closeSession();
				JOptionPane.showMessageDialog(null, "Oferta insertada");
			} catch (Exception e2) {
				JOptionPane.showMessageDialog(null, e2.getMessage());
			}

		}

		if (e.getSource() == btnModif) { // Se pulsa el botón Modificar

		}

		if (e.getSource() == btnBaja) { // Se pulsa el botón Baja

			int seleccion = JOptionPane.showOptionDialog(this,
					"¿Confirma que quiere borrar el registro?",
					"Selector de opciones", JOptionPane.YES_NO_CANCEL_OPTION,
					JOptionPane.QUESTION_MESSAGE, null, // null para icono por
														// defecto.
					new Object[] { "Si", "No" }, // null para YES, NO y CANCEL
					"opcion 1");
			if (seleccion == JOptionPane.YES_OPTION) {
				// BORRAR
				Session sesion = HibernateUtil.getSession();
				HibernateUtil.beginTransaction();

				boolean clie = new OfertasDAOImpl(sesion).borrarOferta(
						oferta.getIdOfertas(), oferta);
				HibernateUtil.endTransaction();
				HibernateUtil.closeSession();
				if (clie) {
					JOptionPane.showMessageDialog(null,
							"Oferta borrada con éxito");
				}

			} else if (seleccion == JOptionPane.NO_OPTION)
				JOptionPane.showMessageDialog(null, "Error al borrar Oferta");
		}

		if (e.getSource() == btnLimpiar) { // Se pulsa el botón Limpiar
			// Muestra todos los registros de la tabla. Se han quitado los
			// filtros
			elQueOrdena.setRowFilter(null);
			// Inicializamos las variables de los JtextFields
			limpiarJTextFields();
		}
	}

	public void mouseClicked(MouseEvent e) {
		if (e.getSource() == lbGestionOfertas) { // Se pulsa la etiqueta del
													// panel Izquierdo Gestión
													// de empleados
			mostrarPanelCentralGestion();
			// Se cambia el color de la etiqueta Gestión de empleados a un azul
			// fuerte.
			lbGestionOfertas.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbAltaOfertas.setForeground(new Color(0, 0, 0));
		}
		if (e.getSource() == lbAltaOfertas) { // Se pulsa la etiqueta del panel
												// Izquierdo Alta de empleados
			mostrarPanelCentralAlta();
			// Se cambia el color de la etiqueta Alta de empleados a un azul
			// fuerte.
			lbAltaOfertas.setForeground(new Color(0, 0, 128));
			// Se cambia el color de la etiqueta Alta de empleados a negro.
			lbGestionOfertas.setForeground(new Color(0, 0, 0));
		}

		if (e.getSource() == table) {
			int fila = table.rowAtPoint(e.getPoint());
			if ((fila > -1)) {
				// txtId.setText(modelo.getValueAt(fila, 0).toString());
				oferta = Cod.get(fila);
			}
		}

	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub

	}

}
